package com.crazymakercircle.mutithread.basic.use;

import com.crazymakercircle.util.Print;
import lombok.extern.slf4j.Slf4j;

import static com.crazymakercircle.util.ThreadUtil.getCurThreadName;
import static com.crazymakercircle.util.ThreadUtil.sleepMilliSeconds;

/**
 * Created by 尼恩@疯狂创客圈.
 */
@Slf4j
public class DaemonDemo2 {

    public static final int SLEEP_GAP = 500;
    public static final int MAX_TURN = 5;

    public static void main(String[] args) throws InterruptedException {
        Thread daemonThread = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                // 守护线程创建的线程也是守护线程
                // 具体来说daemonThread里面创建的normalThread 也是一个守护线程
                Thread normalThread = new NormalThread();
                // 如果要将守护线程所创建的线程调整为用户线程，
                // 可以通过setDaemon(false)，显示地将这些线程设置为用户线程。
                // 上面的代码可以做如下调整，将创建的5条新线程调整为用户线程：
//                normalThread.setDaemon(false);
                normalThread.start();
            }
        }, "daemonThread");
        daemonThread.setDaemon(true);
        daemonThread.start();
        // 这里，一定不能让main线程结束，否则看不到结果
        // 因为这里main线程是唯一的用户线程 为了看到守护线程所输出的部分结果，一定不能让main线程结束掉
        sleepMilliSeconds(SLEEP_GAP);

        Print.synTco(getCurThreadName() + " 运行结束.");
    }

    static class NormalThread extends Thread {
        static int threadNo = 1;

        public NormalThread() {
            super("normalThread-" + threadNo);
            threadNo++;
        }

        public void run() {
            for (int i = 0; ; i++) {
                sleepMilliSeconds(SLEEP_GAP);
                Print.synTco(getName() + ", 守护状态为:" + isDaemon());

            }

        }

    }


}